<?php
namespace app\admin\controller;
use think\facade\Db;
use think\facade\Request;
use think\facade\App;
class Gengxin extends  Base
{
    public function banben() {
    $banben="1.1";  
    return $banben;
    }
    public function index() {
    $data['banben']=$this->banben();
    $url="http://xaike.xyz/apis/gengxin";
       
        // 更新包信息
        $durldata=$this->qingqiu($url,$data);
        $durl=get_object_vars(json_decode($durldata));
         if($durl['code']!==200){
         return alert($durl['msg'],'/admin',6,3);
         exit;
        }
       
    return view('', [
			'data' => $data,
			'durl' => $durl,
		]);    
    }
    public function update() {
        // 这里省略了版本判断逻辑，根据自己需要去写
        // $banben=file_get_contents("banben.txt"); 
        $data['banben']=$this->banben();
        $url="http://xaike.xyz/apis/gengxin";
       
        // 更新包信息
        $durldata=$this->qingqiu($url,$data);
        $durl=get_object_vars(json_decode($durldata));
         if($durl['code']!==200){
         return alert($durl['msg'],'/admin',6,3);
         exit;
        }
        $file_url = $durl['url']; //更新包的下载地址
        $filename = basename($file_url); //更新包文件名称

        // 检查和创建文件夹
        $dir = App::getRootPath(). "runtime/update/";
       
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
        }
 
        // 下载更新包到本地并赋值文件路径变量
        $path = file_exists($dir.$filename)?$dir.$filename:$this->download_file($file_url,$dir,$filename);
 
        // 如果下载没成功就返回报错
        if (!file_exists($dir.$filename)) {
            return json(["msg" => '文件下载失败！', "code" => 100]);
        }
 
        // PHP解压的扩展类
        if(!class_exists("\ZipArchive")) return json(['code' => 100, 'msg' => '请安装ZipArchive扩展！']);
 
        // 实例化ZipArchive
        $zip = new \ZipArchive();
 
        //打开压缩包
        if ($zip->open($path) === true) {
            // 复制根目录，ROOT_PATH在入口文件已经定义了
            $toPath = App::getRootPath();
            try {
                // 解压文件到toPath路径下，用于覆盖差异文件
                $zip->extractTo($toPath);
                // 必须销毁变量，否则会报错
                unset($zip);
                // 删除更新包
                unlink($path);
            } catch (\Exception $e) {
                return json(["msg" => "没有[" . $toPath . "]目录的写入权限", "code" => 100]);
            }
 
            //文件差异覆盖完成，开始更新数据库
            if(file_exists(App::getRootPath() . "/sql.php")){
                // 这里的数据库是.php文件，是可执行的php代码，不是.sql数据库文件，记住！！！
                include App::getRootPath() . "/sql.php";
                chmod(App::getRootPath() . "/sql.php",0777);
                unlink(App::getRootPath() . "/sql.php");
            }
            // 更新完成
            echo("更新完成");
        } else {
            // 压缩包打开失败，删除文件并且返回报错
            unlink($path);
            echo("更新失败，请重试。");
        }
    }
     /*
    * 文件下载方法
    * $url 文件下载地址
    * $dir 存储的文件夹
    * $filename 文件名字
    */
    public function download_file($url, $dir, $filename = '') {
        if (empty($url)) {
            return false;
        }
        $ext = strrchr($url, '.');
 
        $dir = realpath($dir);
        //目录+文件
        $filename = (empty($filename) ? '/' . time() . '' . $ext : '/' . $filename);
        $filename = $dir . $filename;
        //开始捕捉
        ob_start();
 
        try {
            readfile($url);
        } catch (\Exception $e) {
            return json(["msg" => "文件下载失败，请联系开发人员！", 'code' => 100]);
        }
 
        $img = ob_get_contents();
        ob_end_clean();
        $size = strlen($img);
        $fp2 = fopen($filename, "a");
        fwrite($fp2, $img);
        fclose($fp2);
        return $filename;
    }

    
}